/**
 * @file uart_common.h
 * @brief UART通用抽象层头文件
 * 
 * 该模块提供统一的UART操作接口，消除各线程中重复的串口初始化代码。
 * 支持RS232和RS485两种串口类型，提供统一的配置和操作接口。
 * 
 * @author 伞控无人机项目组
 * @date 2024
 */

#ifndef UART_COMMON_H
#define UART_COMMON_H

#include <stdint.h>
#include <sys/types.h>

#ifdef __cplusplus
extern "C" {
#endif

// 串口类型定义
typedef enum {
    UART_TYPE_RS232 = 0,    // RS232串口
    UART_TYPE_RS485 = 1     // RS485串口
} uart_type_t;

// 串口配置结构体
typedef struct {
    int baudrate;           // 波特率
    int data_bits;          // 数据位 (5,6,7,8)
    int stop_bits;          // 停止位 (1,2)
    int parity;             // 校验位 (0=无校验, 1=奇校验, 2=偶校验)
    int flow_control;       // 流控制 (0=无, 1=软件, 2=硬件)
    int timeout_ms;         // 超时时间(毫秒)
    int buffer_size;        // 缓冲区大小(字节)
    int flags;              // 特殊标志位
} uart_config_t;

// 串口状态结构体
typedef struct {
    int fd;                 // 文件描述符
    uart_type_t type;       // 串口类型
    const char *device;     // 设备路径
    uart_config_t config;   // 当前配置
    int is_open;            // 是否已打开
    int error_code;         // 错误代码
} uart_status_t;

// 默认配置常量
#define UART_DEFAULT_BAUDRATE     115200
#define UART_DEFAULT_DATA_BITS    8
#define UART_DEFAULT_STOP_BITS    1
#define UART_DEFAULT_PARITY       0
#define UART_DEFAULT_FLOW_CONTROL 0
#define UART_DEFAULT_TIMEOUT_MS   100
#define UART_DEFAULT_BUFFER_SIZE  65536

// 特殊标志位定义
#define UART_FLAG_NONBLOCK        0x01    // 非阻塞模式
#define UART_FLAG_RAW_MODE        0x02    // 原始模式
#define UART_FLAG_LARGE_BUFFER    0x04    // 大缓冲区模式

// 错误代码定义
#define UART_SUCCESS               0       // 成功
#define UART_ERROR_OPEN           -1       // 打开设备失败
#define UART_ERROR_CONFIG         -2       // 配置失败
#define UART_ERROR_INVALID_PARAM  -3       // 无效参数
#define UART_ERROR_IO             -4       // IO操作失败
#define UART_ERROR_TIMEOUT        -5       // 超时错误

/**
 * @brief 获取默认UART配置
 * 
 * @param type 串口类型
 * @return uart_config_t 默认配置
 */
uart_config_t uart_get_default_config(uart_type_t type);

/**
 * @brief 初始化UART设备
 * 
 * @param device 设备路径 (如 "/dev/ttyS8")
 * @param type 串口类型
 * @param config 串口配置，如果为NULL则使用默认配置
 * @return int 成功返回文件描述符，失败返回错误代码
 */
int uart_init_device(const char *device, uart_type_t type, const uart_config_t *config);

/**
 * @brief 关闭UART设备
 * 
 * @param fd 文件描述符
 * @return int 成功返回0，失败返回错误代码
 */
int uart_close_device(int fd);

/**
 * @brief 设置串口缓冲区大小
 * 
 * @param fd 文件描述符
 * @param size 缓冲区大小(字节)
 * @return int 成功返回0，失败返回错误代码
 */
int uart_set_buffer_size(int fd, int size);

/**
 * @brief 获取串口状态
 * 
 * @param fd 文件描述符
 * @param status 状态结构体指针
 * @return int 成功返回0，失败返回错误代码
 */
int uart_get_device_status(int fd, uart_status_t *status);

/**
 * @brief 清空串口缓冲区
 * 
 * @param fd 文件描述符
 * @param direction 方向 (TCIFLUSH=输入, TCOFLUSH=输出, TCIOFLUSH=双向)
 * @return int 成功返回0，失败返回错误代码
 */
int uart_flush_buffer(int fd, int direction);

/**
 * @brief 设置串口超时
 * 
 * @param fd 文件描述符
 * @param timeout_ms 超时时间(毫秒)
 * @return int 成功返回0，失败返回错误代码
 */
int uart_set_timeout(int fd, int timeout_ms);

#ifdef __cplusplus
}
#endif

#endif // UART_COMMON_H 